package cn.good.yan;

import cn.good.yan.mapper.BillMapper;
import cn.good.yan.mapper.ContentMapper;
import cn.good.yan.mapper.UserMapper;
import cn.good.yan.pojo.Bill;
import cn.good.yan.pojo.BillMore;
import cn.good.yan.pojo.Content;
import cn.good.yan.pojo.User;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 测试 - 操作数据库
 *      t1  测试 注解版CURD
 *      t2  测试 XML的CURD
 *      t3  一对多，多对一关系映射
 *      t4  动态sQL + 批量新增、批量修改
 *      t5  测试 分页查询
 *
 * @author shengren.yan
 * @create 2022-11-24
 */
@SpringBootTest
public class testMybatis {

    @Autowired(required = false)
    private BillMapper billMapper;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private ContentMapper contentMapper;

    /**
     * 测试注解版 的CURD
     * @Transactional(propagation = Propagation.REQUIRED) - 如果在此处增加注解，执行完自动回滚
     */
    @Test
    void test1() {
        // 新增 (会返回主键id)
        Bill bill = new Bill();
        bill.setBillCode("注解版新增1");
        bill.setBillName("注解版新增name");
        billMapper.add(bill);
        System.out.println("主键：" + bill.getBid());

        // 修改
        bill.setBid(38L);
        bill.setBillName("nnn");
        billMapper.update(bill);

        // 查询 - 通过id查询对象
        List<Bill> byBid = billMapper.findByBid(25L);
        System.out.println(byBid);

        // 批量查询 (参数需要是字符串)
        List<Long> longs = Arrays.asList(25L, 24L);
        String join = StringUtils.join(longs, ",");
        List<Bill> byBids = billMapper.findByBids(join);
        System.out.println(byBids);

        // 删除 - 通过id删除
        billMapper.deletePByPid(25L);
    }

    /**
     * 测试XML 的CURD
     * @Transactional(propagation = Propagation.REQUIRED) - 如果在此处增加注解，执行完自动回滚
     */
    @Test
    void test2() {
        // 新增 (会返回主键id)
        List<User> all = userMapper.findAll();
        System.out.println(all);

        // 新增一个
        User u1 = new User();
        u1.setUsername("XML新增1");
        u1.setRealName("12311");
        u1.setPassword("123");
//        int i = userMapper.insetOne(u1);
        System.out.println("主键：" + u1.getId());

        // 批量新增 , list 上的主键id也会返回
        User u2 = new User();
        u2.setUsername("XML新增2");
        u2.setRealName("1231122");
        u2.setPassword("123");
        List<User> list = new ArrayList<>();
        list.add(u1);
        list.add(u2);
//        userMapper.insetALl(list);
        System.out.println(list);

    }


    /**
     * 关联查询 的CURD
     * @Transactional(propagation = Propagation.REQUIRED) - 如果在此处增加注解，执行完自动回滚
     */
    @Test
    void test3() {
        // 关联查询 ： 一对一 查询
        List<Bill> billAll = userMapper.findBillAll();
        System.out.println(billAll);
        // 关联查询 ： 多对一 查询
        List<Bill> billAll2 = userMapper.findBillAllMore();
        System.out.println(billAll2);
        // 关联查询 ： 一对多 查询
        List<Content> contents = contentMapper.findAll();
        System.out.println(contents);
    }

    /**
     * 动态sQL + 批量新增、批量修改
     * @Transactional(propagation = Propagation.REQUIRED) - 如果在此处增加注解，执行完自动回滚
     */
    @Test
    void test4() {
        // 动态SQL if、trim 标签
        List<Content> c1 = contentMapper.findAllByObj();

        // choose、when、otherwise  选择
        List<Content> allChoose = contentMapper.findAllChoose(new BillMore());

        // 批量删除
        List<Long> ids = new ArrayList<>();
        contentMapper.deleteByAll(ids);

        // 批量添加
        List<Content> contents = new ArrayList<>();
        contentMapper.addByAll(contents);

        // 批量修改
        contentMapper.updateAll(contents);
    }

    /**
     *  测试 分页查询
     */
    @Test
    void test5() {
        // 当前页的页码
        Integer pageNum = 1;
        // 每页显示的条数
        Integer pageSize = 2;
        Page<Bill> objects = PageHelper.startPage(pageNum, pageSize);
        List<Bill> all = billMapper.findAll();
//        PageInfo<Bill> list = new PageInfo<>(all);
        // 参数：数据 / 參數2： 页码 尽量是奇数  例： 1,2,3,4,5, 页码就是，最下面的1,2...4,5
        PageInfo<Bill> list = new PageInfo<>(all, 3);
//        System.out.println(list);

        System.out.println("-----------------------------");
        list.getList().stream().filter(Objects::nonNull).forEach(x->{
            System.out.println(x);
        });
        System.out.println("-----------------------------");

        System.out.println("当前页的页码：" + list.getPageNum());
        System.out.println("每页显示的条数：" + list.getPageSize());
        System.out.println("当前页显示的真实条数：" + list.getSize());
        System.out.println("总记录数 ：" + list.getTotal());
        System.out.println("总页数 ：" + list.getPages());
        System.out.println("上一页的页码 ：" + list.getPrePage());
        System.out.println("下一页的页码 ：" + list.getNextPage());
        System.out.println("是否为第一页 ：" + list.isIsFirstPage());
        System.out.println("是否为最后一页 ：" + list.isIsLastPage());
        System.out.println("是否存在上一页 ：" + list.isHasPreviousPage());
        System.out.println("是否存在下一页 ：" + list.isHasNextPage());
        System.out.println("导航分页的页码数 ：" + list.getNavigatePages());

        System.out.println("导航分页的页码 ：" + list.getNavigatepageNums());
        int[] navigatepageNums = list.getNavigatepageNums();
        Arrays.stream(navigatepageNums).forEach(x->{
            System.out.println(x);
        });


    }

}
